/**
 * 缩略图生成队列管理工具
 */

class ThumbnailQueue {
  constructor(concurrency = 3) {
    this.queue = [];
    this.processing = new Set();
    this.concurrency = concurrency;
  }

  /**
   * 添加任务到队列
   * @param {Function} task 任务函数，需要返回Promise
   * @param {string} id 任务ID，用于去重
   * @returns {Promise} 任务执行的Promise
   */
  add(task, id) {
    return new Promise((resolve, reject) => {
      // 如果已经在处理中，不重复添加
      if (this.processing.has(id)) {
        console.log(`任务 ${id} 已在处理中，不重复添加`);
        return resolve(null);
      }

      // 添加到队列
      this.queue.push({
        id,
        task,
        resolve,
        reject
      });

      // 尝试处理队列
      this.processQueue();
    });
  }

  /**
   * 处理队列中的任务
   */
  async processQueue() {
    // 如果已经达到并发上限，等待
    if (this.processing.size >= this.concurrency) {
      return;
    }

    // 获取下一个任务
    const item = this.queue.shift();
    if (!item) {
      return; // 队列为空
    }

    // 标记为处理中
    this.processing.add(item.id);

    try {
      // 执行任务
      console.log(`开始处理任务: ${item.id}`);
      const result = await item.task();
      
      // 完成后解决Promise
      item.resolve(result);
      console.log(`任务完成: ${item.id}`);
    } catch (error) {
      // 出错时拒绝Promise
      console.error(`任务失败: ${item.id}`, error);
      item.reject(error);
    } finally {
      // 无论成功失败，都从处理中移除
      this.processing.delete(item.id);
      
      // 继续处理队列
      this.processQueue();
    }
  }

  /**
   * 获取当前队列状态
   */
  getStatus() {
    return {
      queued: this.queue.length,
      processing: this.processing.size,
      concurrency: this.concurrency
    };
  }
}

// 创建一个全局实例
const thumbnailQueue = new ThumbnailQueue(3);

module.exports = thumbnailQueue; 